<?php

function uploadImage($inputName, $name) {
    if (getImageUploadName() != null) {
        $name = getImageUploadName();
    }
    $maxsize = 1024 * 8 * 1024 * 5;

    if (is_uploaded_file($_FILES[$inputName]['tmp_name'])) {

        if ($_FILES[$inputName]['size'] < $maxsize) {
            $file = $_FILES[$inputName]['tmp_name'];
            $fileName = $_FILES[$inputName]['name'];
            $imgData = imagecreatefromstring(file_get_contents($file));
            list($width, $height) = getimagesize($file);
            ob_start();
            imagejpeg($imgData);
            $full = ob_get_contents();
            ob_end_clean();
            $full = base64_encode($full);


            if (Settings::$imageMediumX == "auto") {
                $tempMediumWidth = $width / ($height / Settings::$imageMediumY);
                $image_medium = imagecreatetruecolor($tempMediumWidth, Settings::$imageMediumY);
                imagecopyresampled($image_medium, $imgData, 0, 0, 0, 0, $tempMediumWidth, Settings::$imageMediumY, $width, $height);
            } else {
                $image_medium = imagecreatetruecolor(Settings::$imageMediumX, Settings::$imageMediumY);
                imagecopyresampled($image_medium, $imgData, 0, 0, 0, 0, Settings::$imageMediumX, Settings::$imageMediumY, $width, $height);
            }
            if (Settings::$imageSmallX == "auto") {
                $tempSmallWidth = $width / ($height / Settings::$imageSmallY);
                $image_small = imagecreatetruecolor($tempSmallWidth, Settings::$imageSmallY);
                imagecopyresampled($image_small, $imgData, 0, 0, 0, 0, $tempSmallWidth, Settings::$imageSmallY, $width, $height);
            } else {
                $image_small = imagecreatetruecolor(Settings::$imageSmallX, Settings::$imageSmallY);
                imagecopyresampled($image_small, $imgData, 0, 0, 0, 0, Settings::$imageSmallX, Settings::$imageSmallY, $width, $height);
            }

            $ext = explode(".", $fileName);

            ob_start();
            imagejpeg($image_medium);
            $medium = ob_get_contents();
            ob_end_clean();
            $medium = base64_encode($medium);

            ob_start();
            imagejpeg($image_small);
            $small = ob_get_contents();
            ob_end_clean();
            $small = base64_encode($small);

            $query = sprintf(SQL::$SELECT_IMG_SMALL, mysql_real_escape_string($name));
            $result = mq($query);
            $row = mysql_fetch_array($result);
            if ($row) {
                $query = sprintf(SQL::$UPDATE_IMG, getUserId(), $full, $medium, $small, mysql_real_escape_string($ext[1]), mysql_real_escape_string($name));
                $result = mq($query);
            } else {
                $query = sprintf(SQL::$INSERT_IMG, mysql_real_escape_string($name), getUserId(), $full, $medium, $small, mysql_real_escape_string($ext[1]));
                $result = mq($query);
            }

            imagedestroy($image_medium);
            imagedestroy($image_small);
            imagedestroy($imgData);
        }
    } else {
        echo
        '<div>File exceeds the Maximum File limit</div>
          <div>Maximum File limit is ' . $maxsize . '</div>
          <div>File ' . $_FILES[$inputName]['name'] . ' is ' . $_FILES[$inputName]['size'] . ' bytes</div>
          <hr />';
    }
}

/**
 * Handle file uploads via XMLHttpRequest
 */
class qqUploadedFileXhr {

    /**
     * Save the file to the specified path
     * @return boolean TRUE on success
     */
    function save($name) {
        uploadImage('stream', $name);
        return true;
    }

    function getName() {
        return $_GET['qqfile'];
    }

    function getSize() {
        if (isset($_SERVER["CONTENT_LENGTH"])) {
            return (int) $_SERVER["CONTENT_LENGTH"];
        } else {
            throw new Exception('Getting content length is not supported.');
        }
    }

}

/**
 * Handle file uploads via regular form post (uses the $_FILES array)
 */
class qqUploadedFileForm {

    /**
     * Save the file to the specified path
     * @return boolean TRUE on success
     */
    function save($name) {
        uploadImage('qqfile', $name);
        return true;
    }

    function getName() {
        return $_FILES['qqfile']['name'];
    }

    function getSize() {
        return $_FILES['qqfile']['size'];
    }

}

class qqFileUploader {

    private $allowedExtensions = array();
    private $sizeLimit = 10485760;
    private $file;

    function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760) {
        $allowedExtensions = array_map("strtolower", $allowedExtensions);

        $this->allowedExtensions = $allowedExtensions;
        $this->sizeLimit = $sizeLimit;

        $this->checkServerSettings();

        if (isset($_GET['qqfile'])) {
            $this->file = new qqUploadedFileXhr();
        } elseif (isset($_FILES['qqfile'])) {
            $this->file = new qqUploadedFileForm();
        } else {
            $this->file = false;
        }
    }

    private function checkServerSettings() {
        $postSize = $this->toBytes(ini_get('post_max_size'));
        $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));

        if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit) {
            $size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
            die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
        }
    }

    private function toBytes($str) {
        $val = trim($str);
        $last = strtolower($str[strlen($str) - 1]);
        switch ($last) {
            case 'g': $val *= 1024;
            case 'm': $val *= 1024;
            case 'k': $val *= 1024;
        }
        return $val;
    }

    /**
     * Returns array('success'=>true) or array('error'=>'error message')
     */
    function handleUpload($replaceOldFile = FALSE) {

        if (!$this->file) {
            return array('error' => 'No files were uploaded.');
        }

        $size = $this->file->getSize();

        if ($size == 0) {
            return array('error' => 'File is empty');
        }

        if ($size > $this->sizeLimit) {
            return array('error' => 'File is too large');
        }

        $pathinfo = pathinfo($this->file->getName());
        $filename = $pathinfo['filename'];
        //$filename = md5(uniqid());
        $ext = $pathinfo['extension'];

        if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) {
            $these = implode(', ', $this->allowedExtensions);
            return array('error' => 'File has an invalid extension, it should be one of ' . $these . '.');
        }

        if ($this->file->save($_GET["id"])) {
            return array('success' => true);
        } else {
            return array('error' => 'Could not save uploaded file.' .
                'The upload was cancelled, or server error encountered');
        }
    }

}

?>